/*
 * @Author: FANQIELAN
 * @Date: 2024-11-20 17:44:37
 * @LastEditors: FANQIELAN
 * @LastEditTime: 2024-11-22 19:43:13
 * @FilePath: \embedded-learning\DataStructure\C\src\C_SeqList.c
 * @Description: 
 * 
 * Copyright (c) 2024 by FANQIELAN, All Rights Reserved. 
 */

#include "../include/C_SeqList.h"
#include "stdio.h"
#include "stdlib.h"

/**
 * @description: 初始化顺序表，清空表中所有数据并将表长度置为0。
 * @param {SeqList} *L - 顺序表的指针，指向一个未初始化的顺序表结构。
 * @return {void} 无返回值。
 * @note 该函数会将顺序表中的所有元素设置为0，并且长度将被重置为0。请确保在调用此函数前，顺序表已分配空间。
 */
void InitList(SeqList *L)
{
    for (int i = 0; i < MAX_SIZE; i++)
    {
        L->data[i] = 0;
    }
    L->length = 0;
}

/**
 * @description: 定义一个顺序表初始化函数，用于动态分配空间、将顺序表有效长度设置为0。
 *               最大元素数量设置为 INITSIZE。
 * @param {SeqList_Malloc} *L - 指向顺序表结构体的指针 L
 * @return {void} 无返回值。
 */
void InitList_Malloc(SeqList_Malloc *L)
{
    L->data = (int *)malloc(INIT_SIZE * sizeof(int));
    L->length = 0;
    L->MaxSize = INIT_SIZE;
}

/**
 * @description: 扩展顺序表的大小并修改最大元素量。
 *               通过重新分配内存，在顺序表末尾添加空间。
 * @param {SeqList_Malloc} *L - 指向顺序表结构体的指针 L
 * @param {int} len - 要增加的空间长度
 * @return {void} 无返回值。
 */
void IncreaseSize_Malloc(SeqList_Malloc *L, int len)
{
    int *p = L->data;

    /* 重新分配空间 */ 
    L->data = (int *)malloc((L->MaxSize + len) * sizeof(int));
    if (L->data == NULL){
        // 错误处理：内存分配失败
        printf("Memory allocation failed!\n");
        return ;
    }

    /* 复制原有数据到新空间 */
    for (int i = 0; i < L->length; i++){
        L->data[i] = 0;
    }

    /* 更新最大元素量 */
    L->MaxSize = L->MaxSize + len;

    /* 释放原数据的内存 */
    free(p);
}

void PrintList(SeqList_Malloc *L)
{
    printf("The SeqList Data: \n");
    for (int i=0; i < L->length; i++){
        printf("data[%d] = %d\n", i, L->data[i]);
    }
    printf("Now the SeqList Length is %d and the MaxSize is %d\n", L->length, L->MaxSize);
}
